import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '@/store'
Vue.use(VueRouter)

/* 
为了解决vue-router升级到3.1.0版本后引入的promise语法，使用编程式导航
当数据没有改变时，再次点击会报错
解决方法：1.降版本
         2.手动添加一个catch的回调
         3.给push和replace添加判断，如果没有写处理promise对象的回调函数就添加一个
*/

// 先将push和replace保存起来
const originPush = VueRouter.prototype.push;
const originReplace = VueRouter.prototype.replace;

// 让push等于另一个函数
VueRouter.prototype.push = function(location,resolved,rejected){
    // 判断有没传处理 promise的回调函数
    if(resolved === undefined && rejected === undefined){
        // this代表VueRouter的实例对象
        return originPush.call(this,location).catch(()=>{})
    }else{
        return originPush.call(this,location,resolved,rejected)
    }
}

VueRouter.prototype.replace = function(location,resolved,rejected){
    if(resolved === undefined && rejected === undefined){
        return originReplace.call(this,location).catch(()=>{})
    }else{
        return originReplace.call(this,location,resolved,rejected)
    }
}
const router = new VueRouter({
    routes,
    scrollBehavior (to, from, savedPosition) {
        return { x: 0, y: 0 }
      }
})
// 路由守卫
router.beforeEach(async (to, from, next) => {
    // 先拿到路由守卫需要的数据
    let token = store.state.user.token;
    let userInfo = store.state.user.userInfo;
    if(token){
        // 进来就代表登陆过，判断是否跳转到登录页面
        if(to === '/login'){
            // r如果是去登录页面就强制回到首页
            router.push('/')
        }else{
            // 来到这里代表是去其他的页面,需要判断是否有用户信息
            if(userInfo.name){
                // 来到这里表示拥有用户信息可以访问任何页面
                next();
            }else{
                // 来到这里表示没有用户信息需要，发送请求回去用户信息
                try {
                    // 获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    // 获取用户信息失败（不管什么原因都当作token失效，需要重新获取token），就需要重新登录
                    // 删除token和用户信息
                    store.dispatch('deleteToken')
                    next('/login')
                } 
            }
        }
    }else{
        // 就代表没有token需要删除token和用户信息，并且无条件放行(因为这里暂时不涉及支付)
        next()
    }
})

export default router